package com.bocom.hairy.crab.base.common.utils;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 * @ClassName com.bocom.hairy.crab.base.common.utils.Md5Util <br/>
 * @Description: MD5加密工具类       <br/>
 * 支持16位、32位加密，以及加盐和不加盐操作
 * @Author jiangshikun             <br/>
 * @Date 2025/9/3 下午4:02         <br/>
 * @Version V1.0
 * ----------------------------------------
 * （^-^）心即理，知行合--致良知 （^-^）
 * 邮 箱:duzhuai@live.cn
 * 地 址：北京市海淀区永澄北路2号
 **/

public class Md5Util {

    /**
     * 32位MD5加密(不加盐)
     * @param str 待加密字符串
     * @return 32位加密结果
     */
    public static String md532(String str) {
        return md532(str, null);
    }

    /**
     * 32位MD5加密(加盐)
     * @param str 待加密字符串
     * @param salt 盐值
     * @return 32位加密结果
     */
    public static String md532(String str, String salt) {
        try {
            // 如果有盐值，则拼接盐值
            String source = str + (salt != null ? salt : "");

            MessageDigest md = MessageDigest.getInstance("MD5");
            md.update(source.getBytes());
            byte[] byteDigest = md.digest();
            int i;
            StringBuilder buf = new StringBuilder("");
            for (int offset = 0; offset < byteDigest.length; offset++) {
                i = byteDigest[offset];
                if (i < 0) {
                    i += 256;
                }
                if (i < 16) {
                    buf.append("0");
                }
                buf.append(Integer.toHexString(i));
            }
            // 32位加密
            return buf.toString();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 16位MD5加密(不加盐)
     * @param str 待加密字符串
     * @return 16位加密结果
     */
    public static String md516(String str) {
        return md516(str, null);
    }

    /**
     * 16位MD5加密(加盐)
     * @param str 待加密字符串
     * @param salt 盐值
     * @return 16位加密结果
     */
    public static String md516(String str, String salt) {
        // 16位加密是取32位加密结果的第8位到第24位
        String md532Result = md532(str, salt);
        return md532Result != null ? md532Result.substring(8, 24) : null;
    }

    /**
     * 测试方法
     */
    public static void main(String[] args) {
        String testStr = "cips12345678";
        String salt = "abc@123!";

        System.out.println("测试字符串: " + testStr);
        System.out.println("盐值: " + salt);
        System.out.println("--------------------------");

        // 测试不加盐情况
        String md532NoSalt = md532(testStr);
        String md516NoSalt = md516(testStr);
        System.out.println("32位MD5(不加盐): " + md532NoSalt);
        System.out.println("32位长度: " + md532NoSalt.length());
        System.out.println("16位MD5(不加盐): " + md516NoSalt);
        System.out.println("16位长度: " + md516NoSalt.length());
        System.out.println("--------------------------");

        // 测试加盐情况
        String md532WithSalt = md532(testStr, salt);
        String md516WithSalt = md516(testStr, salt);
        System.out.println("32位MD5(加盐): " + md532WithSalt);
        System.out.println("32位长度: " + md532WithSalt.length());
        System.out.println("16位MD5(加盐): " + md516WithSalt);
        System.out.println("16位长度: " + md516WithSalt.length());
        System.out.println("--------------------------");

        // 测试空字符串
        String emptyStr = "";
        System.out.println("空字符串32位MD5: " + md532(emptyStr));
        System.out.println("空字符串16位MD5: " + md516(emptyStr));
    }
}

